package com.sunday.common.sharding.sphere.jdbc.study.base.sync.interrupt;

/**
 * @Description:
 *
 * synchronized锁不带超时功能
 * synchronized锁不带超时功能,而ReentrantLock的tryLock是具备带超时功能的，在指定时间没获取到锁，该线程会苏醒，有助于预防死锁的产生。
 *
 * @Author: zsy
 * @Create: 2023/4/4 15:45
 */
public class NotifyNeedSynchronized {

    public static Object lock = new Object();

    /**
     * 唤醒/等待需要synchronized锁
     *
     * 【结论】使用Object的notify和wait等方法时，必须要使用synchronized锁，否则会抛出IllegalMonitorStateException。
     */
    public static void main(String[] args) throws Exception{
        // 抛出IllegalMonitorStateException
        //lock.notify();
        lock.wait();
    }

    /**
     * 使用synchronized锁时尽量缩小范围以保证性能
     *
     * 使用synchronized锁时，为了尽可能提高性能，我们应该尽量缩小锁的范围。能不锁方法就不锁方法，推荐尽量使用synchronized代码块来降低锁的范围。以下面的一段netty源码为例：
     *
     * 可见，找到并发访问代码的临界区，并不用synchronized锁全部代码，尽量避免使用synchronized来修饰方法。
     *
     */
//    public <T> ServerBootstrap childOption(ChannelOption<T> childOption, T value) {
//        if (childOption == null) {
//            throw new NullPointerException("childOption");
//        }
//        if (value == null) {
//            synchronized (childOptions) {
//                childOptions.remove(childOption);
//            }
//        } else {
//            synchronized (childOptions) {
//                childOptions.put(childOption, value);
//            }
//        }
//        return this;
//    }

}
